home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / slrn / slrn_src / src / chmap.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  5KB  |  245 lines

  1. /* -*- mode: C; mode: fold; -*- */
  2. /* Copyright (c) 1998 John E. Davis (davis@space.mit.edu)
  3.  *
  4.  * This file is part of slrn.
  5.  *
  6.  * Slrn is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  * 
  11.  * Slrn is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * for more details.
  15.  * 
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with Slrn; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, 59 Temple Place - Suite 330, 
  19.  * Boston, MA  02111-1307, USA.
  20.  */
  21.  
  22.  
  23. #include "config.h"
  24. #include "slrnfeat.h"
  25.  
  26. #include <stdio.h>
  27. #include <string.h>
  28.  
  29. #ifdef HAVE_STDLIB_H
  30. # include <stdlib.h>
  31. #endif
  32.  
  33. #ifdef HAVE_UNISTD_H
  34. # include <unistd.h>
  35. #endif
  36.  
  37. #ifdef VMS
  38. # include "vms.h"
  39. #endif
  40.  
  41. #include <slang.h>
  42. #include "jdmacros.h"
  43.  
  44. #include "misc.h"
  45. #include "util.h"
  46. #include "chmap.h"
  47. #include "group.h"
  48. #include "art.h"
  49.  
  50. #if SLRN_HAS_CHARACTER_MAP
  51. char *Slrn_Charset;
  52.  
  53. static char File_Error [] = "File error:";
  54. static char Not_Posted [] = "--- message not posted.";
  55.  
  56. static unsigned char *ChMap_To_Iso_Map;
  57. static unsigned char *ChMap_From_Iso_Map;
  58.  
  59. /* This include file contains static globals */
  60. # include "charmaps.h"
  61.  
  62. static void chmap_map_string (char *str, unsigned char *map)
  63. {
  64.    unsigned char ch;
  65.  
  66.    if (map == NULL)
  67.      return;
  68.  
  69.    while (0 != (ch = *str))
  70.      *str++ = map[ch];
  71. }
  72.  
  73. static void chmap_map_string_from_iso (char *str)
  74. {
  75.    chmap_map_string (str, ChMap_From_Iso_Map);
  76. }
  77.  
  78. static void chmap_map_string_to_iso (char *str)
  79. {
  80.    chmap_map_string (str, ChMap_To_Iso_Map);
  81. }
  82.  
  83. #endif
  84.  
  85. /* We fix the rest of the header later from hide_art_headers() */
  86. void slrn_chmap_fix_headers (void)
  87. {
  88. #if SLRN_HAS_CHARACTER_MAP
  89.    Slrn_Header_Type *h = Slrn_First_Header;
  90.  
  91.    while (h != NULL)
  92.      {
  93.     if ((h->flags & HEADER_CHMAP_PROCESSED) == 0)
  94.       {
  95.          chmap_map_string_from_iso (h->subject);
  96.          chmap_map_string_from_iso (h->from);
  97.          h->flags |= HEADER_CHMAP_PROCESSED;
  98.       }
  99.         h = h->real_next;
  100.      }
  101. #endif
  102. }
  103.  
  104. void slrn_chmap_fix_body (void)
  105. {
  106. #if SLRN_HAS_CHARACTER_MAP
  107.    Slrn_Article_Line_Type *ptr = Slrn_Article_Lines;
  108.  
  109.    while (ptr != NULL)
  110.      {
  111.         chmap_map_string_from_iso (ptr->buf);
  112.         ptr = ptr->next;
  113.      }
  114. #endif
  115. }
  116.  
  117. int slrn_chmap_fix_file (char *file)
  118. {
  119. #if SLRN_HAS_CHARACTER_MAP
  120.    FILE *fp, *tmpfp;
  121.    char buf [4096];
  122.    char tmp_file [SLRN_MAX_PATH_LEN];
  123.    char *name;
  124.    unsigned int len;
  125.    int ret;
  126.  
  127.    name = slrn_basename (file);
  128.    len = (unsigned int) (name - file);
  129.    if (len != 0)
  130.      {
  131.     strncpy (tmp_file, file, len);
  132. # ifndef VMS
  133.     /* It appears that some non-unix systems cannot handle pathnames that
  134.      * end in a trailing slash.
  135.      */
  136.     if (len > 1) len--;
  137. # endif
  138.      }
  139.    else
  140.      {
  141.     tmp_file [0] = '.';
  142.     len++;
  143.      }
  144.    tmp_file [len] = 0;
  145.  
  146.    if (NULL == (fp = fopen (file, "r")))
  147.      {
  148.         slrn_error ("%s %s %s", File_Error, file, Not_Posted);
  149.         return -1;
  150.      }
  151.  
  152.    if (NULL == (tmpfp = slrn_open_tmpfile_in_dir (tmp_file, tmp_file, "w")))
  153.      {
  154.     slrn_error ("%s %s %s", File_Error, tmp_file, Not_Posted);
  155.     fclose (fp);
  156.     return -1;
  157.      }
  158.  
  159.    ret = 0;
  160.    while (NULL != fgets (buf, sizeof (buf), fp))
  161.      {
  162.     chmap_map_string_to_iso (buf);
  163.     if (EOF == fputs (buf, tmpfp))
  164.       {
  165.          slrn_error ("Write Error. Disk Full? %s", Not_Posted);
  166.          ret = -1;
  167.          break;
  168.       }
  169.      }
  170.  
  171.    slrn_fclose (fp);
  172.    if (-1 == slrn_fclose (tmpfp))
  173.      ret = -1;
  174.  
  175.    if (ret == -1)
  176.      {
  177.     (void) slrn_delete_file (tmp_file);
  178.     return -1;
  179.      }
  180.  
  181.    ret = slrn_move_file (tmp_file, file);
  182.    return ret;
  183. #else
  184.    (void) file;
  185.    return 0;
  186. #endif
  187. }
  188.  
  189. #if SLRN_HAS_CHARACTER_MAP
  190. void slrn_chmap_show_supported (void)
  191. {
  192.    CharMap_Type *map;
  193.    unsigned int i;
  194.  
  195.    fprintf (stderr, "Supported character sets include:\n");
  196.    fprintf (stderr, "\tISOLatin\n");
  197.  
  198.    for (i = 0; i < MAX_CHARMAPS; i++)
  199.      {
  200.     map = Char_Maps[i];
  201.     if (map == NULL) continue;
  202.     fprintf (stderr, "\t%s\n", map->map_name);
  203.      }
  204.  
  205.    fprintf (stderr, "Default character set: %s\n", DEFAULT_CHARSET_NAME);
  206. }
  207. #endif
  208.  
  209. int slrn_set_charset (char *name)
  210. {
  211. #if SLRN_HAS_CHARACTER_MAP
  212.    CharMap_Type *map;
  213.    unsigned int i;
  214.  
  215.    if (name == NULL)
  216.      name = DEFAULT_CHARSET_NAME;
  217.  
  218.    ChMap_To_Iso_Map = ChMap_From_Iso_Map = NULL;
  219.    SLsmg_Display_Eight_Bit = 160;
  220.  
  221.    if (0 == slrn_case_strcmp ((unsigned char *)name, (unsigned char *)"isolatin"))
  222.      return 0;
  223.  
  224.    for (i = 0; i < MAX_CHARMAPS; i++)
  225.      {
  226.     map = Char_Maps[i];
  227.     if (map == NULL) continue;
  228.     if (0 == slrn_case_strcmp ((unsigned char *)map->map_name, (unsigned char *)name))
  229.       {
  230.          SLsmg_Display_Eight_Bit = map->display_eight_bit;
  231.          ChMap_From_Iso_Map = map->from_iso_map;
  232.          ChMap_To_Iso_Map = map->to_iso_map;
  233.          return 0;
  234.       }
  235.      }
  236.  
  237.    slrn_error ("Unsupport character set: %s", name);
  238.    return -1;
  239.  
  240. #else
  241.    (void) name;
  242.    return -1;
  243. #endif
  244. }
  245.